import jwt
from comment.utils import const
from datetime import datetime,timedelta
from jwt import PyJWTError
from flask import current_app
from comment.models.user import User

def generate_tokens(uid):
    '''
    一个用户在一次会话生成一个token
    :param uid: 用户id
    :return:
    '''
    #params:是生成token的参数
    params={
        'id':uid,
        #exp：代表token的有效时间,datetime.utcnow():代表当前时间
        #timedelta:表示转化为毫秒
        'exp':datetime.utcnow()+timedelta(seconds=const.JWT_EXPIRY_SECOND)
    }
    #key:密钥,
    #algorithm:算法，算法是SHA-256
    #SHA-256:密码散列函数算法.256字节长的哈希值（32个长度的数组）---》16进制字符串表示，长度为64。信息摘要，不可以逆
    return jwt.encode(payload=params,key=const.SECRET_KEY,algorithm='HS256')



def verify_tokens(token_str):
    '''
    验证token
    :param token_str:如果验证成功返回用户id
    :return:
    '''
    try:
        #返回之前生成token的时候的字典，字典包含id和exp
        data=jwt.decode(token_str,key=const.SECRET_KEY,algorithms='HS256')
        current_app.logger.info(data)
        user=User.query.filter(User.id==data['id']).first()
        if user and user.onlock==0:     #如果用户存在，并且没有锁定
            return {'id':user.id}
        else:
            return {"message":"数据库中不存在当前用户，或者用户已经过期"}
    except PyJWTError as e:
        current_app.logger.error(e)
        return {"message":"token验证失败"}










